Modern imperative languages have powerful capabilities for reflection which make language elements like types, methods and fields accessible to program developers as first class citizens. Debuggers provide a way to freeze an executing program and examine selected variables at a frozen state. Test developers often introduce write statements into programs under test in order to determine whether write statement outputs reflect expected outputs. In transaction processing, the old value of each changed variable was individually saved when a transaction was declared. This data was then available to write back into the program to return to the pre-transaction state in case of a rollback.